Concepto

Algoritmo

Aplicaciones

Casos de exito

Ejemplo en R

Información del conjunto de datos

En este tutorial, utilizará un conjunto de datos de UCI . El conjunto de datos se llama Online-Retail y contiene datos de transacciones del 12/01/2010 al 12/09/2011 para una tienda minorista en línea registrada en el Reino Unido.

Descripción del conjunto de datos Número de filas: 541,909 Número de atributos: 8

Información de atributo

  • Factura No: número de factura. Nominal, un número integral de 6 dígitos asignado exclusivamente a cada transacción. Si este código comienza con la letra ‘c’, indica una cancelación. + StockCode: Código de producto (artículo). Nominal, un número integral de 5 dígitos asignado exclusivamente a cada producto distinto.

  • Descripción: Nombre del producto (artículo). Nominal.

  • Cantidad: las cantidades de cada producto (artículo) por transacción. Numérico.

  • Fecha de factura: Fecha y hora de la factura. Numérico, el día y la hora en que se generó cada transacción. Ejemplo del conjunto de datos: 12/1/2010 8:26

  • Precio unitario: precio unitario. Numérico, precio del producto por unidad en libras esterlinas.

  • CustomerID: número de cliente. Nominal, un número entero de 5 dígitos asignado exclusivamente a cada cliente.

  • País: nombre del país. Nominal, el nombre del país donde reside cada cliente.

Utilícelo read_excel(path to file)para leer el conjunto de datos del archivo descargado en R. Dé su ruta completa al archivo, incluido el nombre de archivo enread_excel(path-to-file-with-filename)

#read excel into R dataframe
retail <- read_excel('/Users/sergio/Documents/Proyectos/Ejemplos Modelos/MBA/Data/Online Retail.xlsx')

Paquetes a utilizar

Paquete Descripción
arules Proporciona la infraestructura para representar, manipular y analizar datos y patrones de transacciones (conjuntos de elementos frecuentes y reglas de asociación).
arulesViz Extiende el paquete ‘arules’ con varias técnicas de visualización para reglas de asociación y conjuntos de elementos. El paquete también incluye varias visualizaciones interactivas para la exploración de reglas.
tidyverse El tidyverse es una colección obvia de paquetes R diseñados para la ciencia de datos.
readxl Leer archivos de Excel en R
plyr Herramientas para dividir, aplicar y combinar datos
ggplot2 Crea gráficos y cuadros
knitr Generación dinámica de informes en R
lubridate Lubridate es un paquete R que facilita el trabajo con fechas y horas.

Preparación de datos

#complete.cases(data) devolverá un vector lógico que indica qué filas no tienen valores faltantes. Luego use el vector para obtener solo las filas que están completas usando retail[,].

retail <- retail[complete.cases(retail), ]

#mutate La función es del paquete dplyr. Se utiliza para editar o agregar nuevas columnas al marco de datos. Aquí la columna Descripción se está convirtiendo en columna de factor. as.factor convierte la columna en columna de factor. %>% es un operador con el que puede canalizar valores a otra función o expresión
retail %>% mutate(Description = as.factor(Description))
retail %>% mutate(Country = as.factor(Country))
# Convierte datos de caracteres hasta la fecha. Almacenar Factura Fecha como fecha en nueva variable
retail$Date <- as.Date(retail$InvoiceDate)
#Extraiga el tiempo de InvoiceDate y almacene en otra variable
TransTime<- format(retail$InvoiceDate,"%H:%M:%S")
#Convierta y edite Factura No en numérico
InvoiceNo <- as.numeric(as.character(retail$InvoiceNo))
## Warning: NAs introduced by coercion
# Vincula nuevas columnas TransTime y InvoiceNo al comercio minorista de marcos de datos

cbind(retail,TransTime)
cbind(retail,InvoiceNo)
# echar un vistazo a sus datos
glimpse(retail)
## Observations: 406,829
## Variables: 9
## $ InvoiceNo   <chr> "536365", "536365", "536365", "536365", "536365", "536365…
## $ StockCode   <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752",…
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANTER…
## $ Quantity    <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, 3,…
## $ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 08:…
## $ UnitPrice   <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1.6…
## $ CustomerID  <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, 1…
## $ Country     <chr> "United Kingdom", "United Kingdom", "United Kingdom", "Un…
## $ Date        <date> 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-…
#ddply(dataframe, variables que se utilizarán para dividir el marco de datos, función que se aplicará)
transactionData <- ddply(retail,c("InvoiceNo","Date"),
                       function(df1)paste(df1$Description,
                       collapse = ","))

# La función de R paste() concatena vectores a caracteres y resultados separados usando collapse=[cualquier cadena de caracteres opcional]. Aquí usamos ','.

glimpse(transactionData)
## Observations: 22,190
## Variables: 3
## $ InvoiceNo <chr> "536365", "536366", "536367", "536368", "536369", "536370",…
## $ Date      <date> 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01…
## $ V1        <chr> "WHITE HANGING HEART T-LIGHT HOLDER,WHITE METAL LANTERN,CRE…
head(transactionData)
#set column InvoiceNo of dataframe transactionData  
transactionData$InvoiceNo <- NULL
#set column Date of dataframe transactionData
transactionData$Date <- NULL
#Rename column to items
colnames(transactionData) <- c("items")
#Show Dataframe transactionData
head(transactionData)
write.csv(transactionData,"/Users/sergio/Documents/Proyectos/Ejemplos Modelos/MBA/Data/market_basket_transactions.csv", quote = FALSE, row.names = FALSE)
387/5000
## [1] 0.0774
#transactionData: datos que se escribirán
# "D: /Documents/market_basket.csv": ubicación del archivo con el nombre del archivo en el que se escribirá
#quote: si es VERDADERO, rodeará la columna de caracteres o factores con comillas dobles. Si FALSO no se citará nada
# row.names: un valor lógico que indica si los nombres de fila de x deben escribirse junto con x, o un vector de caracteres de los nombres de fila que deben escribirse.

tr <- read.transactions('/Users/sergio/Documents/Proyectos/Ejemplos Modelos/MBA/Data/market_basket_transactions.csv', format = 'basket', sep=',')

#sep indica cómo se separan los elementos. En este caso te has separado usando ','

summary(tr)
## transactions as itemMatrix in sparse format with
##  22191 rows (elements/itemsets/transactions) and
##  7876 columns (items) and a density of 0.001930725 
## 
## most frequent items:
## WHITE HANGING HEART T-LIGHT HOLDER           REGENCY CAKESTAND 3 TIER 
##                               1803                               1709 
##            JUMBO BAG RED RETROSPOT                      PARTY BUNTING 
##                               1460                               1285 
##      ASSORTED COLOUR BIRD ORNAMENT                            (Other) 
##                               1250                             329938 
## 
## element (itemset/transaction) length distribution:
## sizes
##    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
## 3598 1594 1141  908  861  758  696  676  663  593  624  537  516  531  551  522 
##   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 
##  464  441  483  419  395  315  306  272  238  253  229  213  222  215  170  159 
##   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48 
##  138  142  134  109  111   90  113   94   93   87   88   65   63   67   63   60 
##   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64 
##   59   49   64   40   41   49   43   36   29   39   30   27   28   17   25   25 
##   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80 
##   20   27   24   22   15   20   19   13   16   16   11   15   12    7    9   14 
##   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96 
##   15   12    8    9   11   11   14    8    6    5    6   11    6    4    4    3 
##   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112 
##    6    5    2    4    2    4    4    3    2    2    6    3    4    3    2    1 
##  113  114  116  117  118  120  121  122  123  125  126  127  131  132  133  134 
##    3    1    3    3    3    1    2    2    1    3    2    2    1    1    2    1 
##  140  141  142  143  145  146  147  150  154  157  168  171  177  178  180  202 
##    1    2    2    1    1    2    1    1    3    2    2    2    1    1    1    1 
##  204  228  236  249  250  285  320  400  419 
##    1    1    1    1    1    1    1    1    1 
## 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    3.00   10.00   15.21   21.00  419.00 
## 
## includes extended item information - examples:
##                       labels
## 1                   1 HANGER
## 2     10 COLOUR SPACEBOY PEN
## 3 12 COLOURED PARTY BALLOONS
# Create an item frequency plot for the top 20 items
if (!require("RColorBrewer")) {
  # install color package of R
install.packages("RColorBrewer")
#include library RColorBrewer
library(RColorBrewer)
}
## Loading required package: RColorBrewer
itemFrequencyPlot(tr,topN=20,type="absolute",col=brewer.pal(8,'Pastel2'), main="Absolute Item Frequency Plot")

itemFrequencyPlot(tr,topN=20,type="relative",col=brewer.pal(8,'Pastel2'),main="Relative Item Frequency Plot")

# Min Support as 0.001, confidence as 0.8.
association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=10))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5   0.001      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 22 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[7876 item(s), 22191 transaction(s)] done [0.24s].
## sorting and recoding items ... [2324 item(s)] done [0.01s].
## creating transaction tree ... done [0.03s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 10
## Warning in apriori(tr, parameter = list(supp = 0.001, conf = 0.8, maxlen = 10)):
## Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
##  done [0.59s].
## writing ... [49122 rule(s)] done [0.06s].
## creating S4 object  ... done [0.03s].
inspect(association.rules[1:10])
shorter.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=3))
subset.rules <- which(colSums(is.subset(association.rules, association.rules)) > 1) # get subset rules in vector
length(subset.rules)  #> 3913
subset.association.rules. <- association.rules[-subset.rules] # remove subset rules.
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(default="lhs",rhs="METAL"))
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))

metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(lhs="METAL",default="rhs"))

# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))

# Filter rules with confidence greater than 0.4 or 40%
subRules<-association.rules[quality(association.rules)$confidence>0.4]
#Plot SubRules
plot(subRules)

plot(subRules,method="two-key plot")

plotly_arules(subRules)

top10subRules <- head(subRules, n = 10, by = "confidence")

plot(top10subRules, method = "graph",  engine = "htmlwidget")

saveAsGraph(head(subRules, n = 1000, by = "lift"), file = "rules.graphml")

# Filter top 20 rules with highest lift
subRules2<-head(subRules, n=20, by="lift")
plot(subRules2, method="paracoord")